<?php


namespace app\index\job;

use app\common\model\EmailLog;
use app\common\model\SalaryLog;
use think\queue\Job;
use PHPMailer\PHPMailer\PHPMailer;
use think\Exception;

ini_set('max_execution_time','0');
class SendEmail
{
    /**
     * fire方法是消息队列默认调用的方法
     * @param Job $job 当前的任务对象
     * @param array|mixed $data 发布任务时自定义的数据
     */
    public function fire(Job $job, $data)
    {
        // 有些消息在到达消费者时,可能已经不再需要执行了
        $isJobStillNeedToBeDone = $this->checkDatabaseToSeeIfJobNeedToBeDone($data);
        if (!$isJobStillNeedToBeDone) {
            $job->delete();
            return;
        }
        //执行发送邮件
        $isJobDone = $this->doJob($data);
        if ($isJobDone) {
            // 如果任务执行成功，删除任务
            print("<warn>邮件队列已执行完成并且已删除！" . "</warn>\n");
            $job->delete();
        } else {
            print("<warn>任务执行失败！" . "</warn>\n".$job->attempts());
            if ($job->attempts() > 100) {
                //通过这个方法可以检查这个任务已经重试了几次了
                print("<warn>邮件队列重试超过100次，现在已经删除该任务" . "</warn>\n");
                $job->delete();
            } else{
                //五分钟后在执行
                $later = strtotime('+10minute');
                $now = time();
                $secend = $later-$now;
                $t = date('Y-m-d H:i:s',$later);
                $job->release($secend); //重发任务
                print ("<info>".$t."重新第" . $job->attempts() . "次执行该任务!</info>\n");

            }
        }
    }

    /**
     * 该方法用于接收任务执行失败的通知
     * @param $data  string|array|... 发布任务时传递的数据
     */
    public function failed($data)
    {

//        $config = config('email.smtp');
//        $mail = new PHPMailer(true);                              // Passing `true` enables exceptions
//        try {
//            $full_content = $data['sendData'];
//
//            //服务器配置
//            $mail->CharSet = "UTF-8";                     //设定邮件编码
//            $mail->SMTPDebug = 0;                        // 调试模式输出
//            $mail->isSMTP();                             // 使用SMTP
//            $mail->Host = $config['host'];                // SMTP服务器
//            $mail->SMTPAuth = true;                      // 允许 SMTP 认证
//            $mail->Username = $config['username'];                // SMTP 用户名  即邮箱的用户名
//            $mail->Password = $config['password'];             // SMTP 密码  部分邮箱是授权码(例如163邮箱)
//            $mail->SMTPSecure = 'ssl';                    // 允许 TLS 或者ssl协议
//            $mail->Port = 465;                            // 服务器端口 25 或者465 具体要看邮箱服务器支持
//            $mail->setFrom($config['address'], $config['name']);  //发件人
//            $mail->addAddress($config['address'], $config['address']);  // 收件人
//            $mail->addReplyTo($config['address'], $config['name']); //回复的时候回复给哪个邮箱 建议和发件人一致
//
//            // 发送附件并且重命名
//
//            //Content
//            $mail->isHTML(true);  // 是否以HTML文档格式发送  发送后客户端可直接显示对应HTML内容
//            $mail->Subject = "邮件任务发送失败";
//            $mail->Body = $data['name'].'邮件发送失败，对方邮箱是'.$data['address'];
//            $mail->AltBody =$data['name'].'邮件发送失败，对方邮箱是'.$data['address'];
//            $mail->send();
//
//        } catch (\Exception $e) {
//            $msg = $data['name'] . '邮件发送失败,错误信息:' . $mail->ErrorInfo;
//            print("<info>{$msg}</info>\n");
//        }
    }

    /**
     * 有些消息在到达消费者时,可能已经不再需要执行了
     * @param array|mixed $data 发布任务时自定义的数据
     * @return boolean                 任务执行的结果
     */
    private function checkDatabaseToSeeIfJobNeedToBeDone($data)
    {
        $status = SalaryLog::where('id', $data['id'])->column('email_status');
        if ($status[0]) {
            return false;
        } else {
            return true;
        }
    }

    public function doJob($data)
    {

        $config = $data['conf'];
        $mail = new PHPMailer(true);                              // Passing `true` enables exceptions
        try {


            $full_content = $data['sendData'];

            //服务器配置
            $mail->CharSet = "UTF-8";                     //设定邮件编码
            $mail->SMTPDebug = 0;                        // 调试模式输出
            $mail->isSMTP();                             // 使用SMTP
            $mail->Host = $config['host'];                // SMTP服务器
            $mail->SMTPAuth = true;                      // 允许 SMTP 认证
            $mail->Username = $config['username'];                // SMTP 用户名  即邮箱的用户名
            $mail->Password = $config['password'];             // SMTP 密码  部分邮箱是授权码(例如163邮箱)
            $mail->SMTPSecure = 'ssl';                    // 允许 TLS 或者ssl协议
            $mail->Port = $config['port'];                            // 服务器端口 25 或者465 具体要看邮箱服务器支持

            $mail->setFrom($config['address'], $config['name']);  //发件人
            $mail->addAddress($data['address'], $data['address']);  // 收件人
            $mail->addReplyTo($config['address'], $config['name']); //回复的时候回复给哪个邮箱 建议和发件人一致

            //发送附件
            if (!empty($data['files'])) {
                foreach ($data['files'] as $k => $v) {
                    $mail->addAttachment($v);
                }
            }
            // 发送附件并且重命名

            //Content
            $mail->isHTML(true);  // 是否以HTML文档格式发送  发送后客户端可直接显示对应HTML内容
            $mail->Subject = $data['subject'];
            $mail->Body = $full_content;
            $mail->AltBody = $data['sendData'];

            $mail->send();
            $msg = $data['name'] . '邮件发送成功';
            $salaryLog = new SalaryLog();
            $emailLog = new EmailLog();
            $res1 = $salaryLog->save(['email_status' => 1], ['id' => $data['id']]);
            $res2 = $emailLog->insert(['salary_id'=>$data['id'],'staff_id' => $data['staff_id'], 'salary_email_content' => $data['sendData'], 'salary_time' => $data['time'], 'salary_email_msg' => $msg, 'status' => 1,'sender'=>$config['address'], 'address' => $data['address'], 'staff_name' => $data['name'],'create_time'=>time(),'update_time'=>time()],true);
            return true;
        } catch (\Exception $e) {
            $emailLog = new EmailLog();
            $msg = $data['name'] . '邮件发送失败,错误信息:' . $mail->ErrorInfo;
            $res2 = $emailLog->insert(['salary_id'=>$data['id'],'staff_id' => $data['staff_id'], 'salary_email_content' => $data['sendData'], 'salary_time' => $data['time'], 'salary_email_msg' => $msg, 'status' => 0,'sender'=>$config['address'], 'address' => $data['address'], 'staff_name' => $data['name'],'create_time'=>time(),'update_time'=>time()],true);
            return false;
        }
    }


}